//
//  main.m
//  自动引用计数
//
//  Created by apple on 15/9/3.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreFoundation/CoreFoundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

//        自动引用计数；
//        1、在编译时自动在合适的位置插入retain和releaes，简化内存管理；
        
//        2、自动引用计数不是自动内存管理，而是通过一些特定的标记来表明如何管理内存；
        
//        3、自动引用计数使用指针（强引用和弱引用）的类型来标记内存管理方式；
        
//        4、只要指向对象的强引用类型的指针数量大于0，对象就不会被释放；
        
        
//        －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
        
//        指针的引用类型－－－>weak/strong
        
//        1、默认为strong类型；
        
//        2、weak类型的指针在它所指向的对象被释放后，自动设置为nil；
        
//        3、assign类型的属性类似weak，但不会自动设置为nil；
        
//        4、retain类型的属性类似strong，用于手动引用计数；
        
//        －－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
        
//        自动引用计数与CoreFoundation;
        
//        1、arc只能管理Objective-C对象，但是对于CoreFoundation中的对象无能为力。因此有另一套规则进行管理；
        
//        修饰符
//        __bridge  作用：oc和cf对象相互转换，不影响引用；
//        __bridge_retained   --->  oc->cf  cf负责管理内存；
//        __bridge_transfer   --->   cf->oc   oc负责管理内存；
        
        
        
#if 0
//       CoreFoundation示例
        Student *stu = [Student new];
        CFTypeRef cfStu = (__bridge CFTypeRef)(stu);
        stu = nil;
        
//        使用__bridge可以从oc到cf之间相互转换，但是不会转移内存的管理，谁创建了还是由谁释放；
#endif
        
#if 0
        
        Student *stu = [Student new];
        CFTypeRef cfStr = (__bridge_retained CFTypeRef)stu;
        stu = nil;
        CFRelease(cfStr);
        
//        使用__bridge_retained将oc转换到cf，因此需要CoreFoundation负责对象的释放；
#endif
        
#if 0
        Student *stu = [Student new];
        CFTypeRef cfStr = (__bridge_retained CFTypeRef)(stu);
        
        stu = (__bridge_transfer id)cfStr;
        stu = nil;
#endif
        
//        atomic/nonatomic
        
//        1、默认为atomic，原子性，编译器保证数据的读写是线程安全的，操作效率低。必须同时实现getter和setter，或者全部由编译器自动生成
        
//        2、nonatomci为非原子性，编译器不会保证getter和setter读写数据的线程安全。效率较高，使用于能够保证线程安全的环境；
        
//        readwrite／readly
        
//        1、默认为readwrite，表示编译器自动生成getter和setter。能够对数据进行读写。
        
//        2、readly表示只生成getter，－－－>只读。
        
    
    
    }
    return 0;
}
